#ifndef __IMU_H_
#define __IMU_H_
#include "main.h"
extern int16_t imu963ra_gyro_x, imu963ra_gyro_y, imu963ra_gyro_z;
extern int16_t imu963ra_acc_x, imu963ra_acc_y, imu963ra_acc_z;
extern int16_t imu963ra_mag_x, imu963ra_mag_y, imu963ra_mag_z;
extern float imu963ra_transition_factor[3];
//
extern float factor_gyro_lvbo;
typedef struct IMU963RA
{
    /* data */
    // 原始数据-漂移数据
    int16_t acc[3];
    int16_t gyro[3];
    int16_t mag[3];
    // 零漂数据
    int32_t acc_offset[3];
    int32_t gyro_offset[3];
    int32_t mag_offset[3];

    // 经过滤波的真实物理数据 m/s2  du/s
    float acc_real[3];
    float gyro_real[3];
    float mag_real[3];
    // 姿态解算的过程需要弧度制 sec/s
    float gyro_real_sec[3];

    // 姿态解算
    float pitch;
    float roll;
    float yaw;

    // 低通滤波
    float yaw_temp;

} imu963_t;
extern imu963_t imu963;
void get_imu_data(imu963_t *imu);
void get_imu_offset(imu963_t *imu);
void get_imu_data(imu963_t *imu);

//
uint8_t IMU_ReadID();
uint8_t regtext(uint8_t reg);
void imu963ra_read_acc_gyro_register(uint8_t reg, uint8_t *val);
void imu963ra_write_acc_gyro_register(uint8_t reg, uint8_t data);
uint8_t imu963ra_acc_gyro_self_check(void);
uint8_t imu963ra_mag_self_check(void);
uint8_t imu963ra_write_mag_register(uint8_t addr, uint8_t reg, uint8_t data);
uint8_t imu963ra_read_mag_register(uint8_t addr, uint8_t reg);
void imu963ra_connect_mag(uint8_t addr, uint8_t reg);
void imu963ra_get_gyro(void);
void imu963ra_get_mag(void);
void imu963ra_get_acc(void);
uint8_t imu963ra_init(void);
//-------------------------------------------------------------------------------------------------------------------
// 函数简介     将 IMU963RA 加速度计数据转换为实际物理数据
// 参数说明     acc_value       任意轴的加速度计数据
// 返回参数     void
// 使用示例     float data = imu963ra_acc_transition(imu963ra_acc_x);           // 单位为 g(m/s^2)
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
#define imu963ra_acc_transition(acc_value) ((float)(acc_value) / imu963ra_transition_factor[0])

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     将 IMU963RA 陀螺仪数据转换为实际物理数据
// 参数说明     gyro_value      任意轴的陀螺仪数据
// 返回参数     void
// 使用示例     float data = imu963ra_gyro_transition(imu963ra_gyro_x);         // 单位为 °/s
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
#define imu963ra_gyro_transition(gyro_value) ((float)(gyro_value) / imu963ra_transition_factor[1])

//-------------------------------------------------------------------------------------------------------------------
// 函数简介     将 IMU963RA 磁力计数据转换为实际物理数据
// 参数说明     mag_value       任意轴的磁力计数据
// 返回参数     void
// 使用示例     float data = imu963ra_mag_transition(imu963ra_mag_x);           // 单位为 G
// 备注信息
//-------------------------------------------------------------------------------------------------------------------
#define imu963ra_mag_transition(mag_value) ((float)(mag_value) / imu963ra_transition_factor[2])
// 姿态解算
#endif
